#ifndef MATRIX_H
#define MATRIX_H

#include "globals.h"
namespace gemren
{
	struct matrix4x4{
	public:
		typedef float float_type;
		typedef embree::Vec3f coord;
		float_type& operator()(int row,int column);
		const float_type& operator()(int row,int column) const;
	
		matrix4x4 operator *(const matrix4x4& r)const;
		coord operator*(const coord& vect)const;
		static matrix4x4 identity();
		static matrix4x4 move(float_type x, float_type y, float_type z);
		static matrix4x4 scale(float_type x, float_type y, float_type z);
		static matrix4x4 rotateX(float_type angle);
		static matrix4x4 rotateY(float_type angle);
		static matrix4x4 rotateZ(float_type angle);
		static matrix4x4 linear_transformation(const coord& base1, const coord& base2, const coord& base3);
		matrix4x4();
		coord transform_vector(const coord& c)const;
	protected:
		matrix4x4(float_type a1, float_type a2, float_type a3, float_type a4,
				  float_type b1, float_type b2, float_type b3, float_type b4,
				  float_type c1, float_type c2, float_type c3, float_type c4,
				  float_type d1, float_type d2, float_type d3, float_type d4);
	
		float_type mat[16];
		void multvec(coord& c)const;// transforms without moving
	};
}
#endif